package com.gomoku;

import java.io.Serializable;
import java.util.List;

// 游戏结束原因
enum GameOverReason {
    LOST,           // 失败
    RIVAL_ADMIT,    // 对手认输
    SELF_ADMIT,     // 自己认输
    WON             // 胜利
}

// 协议
class GomokuProtocol implements Serializable {
    // 协议类型
    public enum Type {
        FIND_USERS,     // 寻找其它用户
        GAME_OVER,      // 游戏结束
        INVITE_REQUEST, // 挑战请求
        INVITE_RESULT,  // 挑战结果
        LOGON,          // 登录
        PUT_PIECE,      // 放置棋子
        QUIT_GAME       // 退出游戏
    }

    public static final String SERVER_IP = "192.168.1.108"; // 服务器 IP 地址
    public static final int SERVER_PORT = 10000;            // 服务器端口号
    public final Type mType;                                // 协议类型
    public final String mUsername;                          // 用户名

    /**
     * 构造方法。
     * @param type      类型
     * @param username  用户名
     */
    public GomokuProtocol(Type type, String username) {
        mType = type;
        mUsername = username;
    }
}

// 寻找用户请求
class FindUsersRequest extends GomokuProtocol {
    /**
     * 构造方法。
     * @param username  用户名
     */
    public FindUsersRequest(String username) {
        super(Type.FIND_USERS, username);
    }
}

// 寻找用户结果
class FindUsersResult extends GomokuProtocol {
    public final List<String> mUsernameList;    // 用户名列表

    /**
     * 构造方法。
     * @param usernameList  用户名列表
     */
    public FindUsersResult(List<String> usernameList) {
        super(Type.FIND_USERS, "");
        mUsernameList = usernameList;
    }
}

// 游戏结束
class GameOver extends GomokuProtocol {
    public final GameOverReason mReason;    // 结束原因

    /**
     * 构造方法。
     * @param reason    结束原因
     * @param rivalName 对手的名字
     */
    public GameOver(GameOverReason reason, String rivalName) {
        super(Type.GAME_OVER, rivalName);
        mReason = reason;
    }
}

// 挑战请求
class InviteRequest extends GomokuProtocol {
    public final String mRivalName; // 对手的名字

    /**
     * 构造方法。
     * @param rivalName 对手的名字
     * @param username  用户名
     */
    public InviteRequest(String rivalName, String username) {
        super(Type.INVITE_REQUEST, username);
        mRivalName = rivalName;
    }
}

// 挑战结果
class InviteResult extends GomokuProtocol {
    public final boolean mAccept;   // 接受挑战则为 true，否则为 false
    public final String mRivalName; // 对手的名字

    /**
     * 构造方法。
     * @param accept    接受挑战则为 true，否则为 false
     * @param rivalName 对手的名字
     * @param username  用户名
     */
    public InviteResult(boolean accept, String rivalName, String username) {
        super(Type.INVITE_RESULT, username);
        mAccept = accept;
        mRivalName = rivalName;
    }
}

// 登录请求
class LogonRequest extends GomokuProtocol {
    /**
     * 构造方法。
     * @param username  用户名
     */
    public LogonRequest(String username) {
        super(Type.LOGON, username);
    }
}

// 登录结果
class LogonResult extends GomokuProtocol {
    /**
     * 构造方法。
     * @param username  用户名
     */
    public LogonResult(String username) {
        super(Type.LOGON, username);
    }
}

// 放置棋子
class PutPiece extends GomokuProtocol {
    public final int mX;    // x 坐标（窗口坐标）
    public final int mY;    // y 坐标（窗口坐标）

    /**
     * 构造方法。
     * @param rivalName 对手的名字
     * @param x, y      棋子位置（窗口坐标）
     */
    public PutPiece(String rivalName, int x, int y) {
        super(Type.PUT_PIECE, rivalName);
        mX = x;
        mY = y;
    }
}

// 退出游戏
class QuitGame extends GomokuProtocol {
    /**
     * 构造方法。
     * @param username  用户名
     */
    public QuitGame(String username) {
        super(Type.QUIT_GAME, username);
    }
}
